package Day20.Predicate;

/**
 * @version 1.0
 * @BelongsProject:IntelliJ IDEA
 * @BelongsPackage:Day20.Predicate
 * @Author:hyhWTX
 * @ClassName:Demo02Predicate_and
 * @CreateTime:2022年-10月-02日 17:02
 * @Description: TODO (一句话描述以下该类的功能)
 */

import java.util.function.Predicate;

/**
 * 逻辑表达式：可以连接多个判断的条件
 * &&：与运算符，有false则false
 * ||:或运算符，有true则true
 * !:非（取反）运算符，非真则假，非假则真
 * <p>
 * 需求:判断一个字符串,有两个判断的条件
 * 1.更断字符串的长度是善大于5
 * 2.少断字行串中是否包含a
 * 两个条件必须同时满足,我就可以使用&&运算符连接两个条件
 * <p>
 * Predicate接口中有一个方法and，表示并且关系，也可以用于连接两个判断条件
 * default Predicate<T> and(Predicate<? super T> other) {
 * Objects.requireNonNull(other);
 * return (t) -> test(t) && other.test(t);
 * }
 * 方法内部的两个判断条件使用的是两个与运算符连接起来的
 */

public class Demo02Predicate_and {
    /**
     * 定义一个方法：方法的参部，传递一个字符串
     * 传递两个Predicate接口
     * 1.一个用于判断字符串的长度是否大于5
     * 2.一个用于判断字符串中是否包含a
     * 注意：两个条件必须同时满足
     */
    public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
//        return pre1.test(s) && pre2.test(s);
        return pre1.and(pre2).test(s);
    }
    public static boolean checkString2(String s,Predicate<String> pre3,Predicate<String> pre4){
        return pre3.and(pre4).test(s);
    }

    public static void main(String[] args) {
        //定义一字符串
        String s = "AHICFJKANSMAK";
        //调用checkString方法,并且传递两个Lambda表达式
        boolean b1 = checkString(s, (String s1) -> {
            return s1.length()>5;
        }, (String s2) -> {
            return s2.contains("A");
        });
        System.out.println(b1);


        //定义一个字符串
        String s2 = "abdsiaklcka";
        boolean b2 = checkString2(s2, (String s3) -> {
            return s3.length()>10;
        }, (String s4) -> {
            return s4.contains("b");
        });
        System.out.println(b2);
    }
}
